﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace Jurassic_Island
{
    public partial class FormInsertCamino : Form
    {
        private ENLugares enLug = new ENLugares();
        private ENCaminos enCam = new ENCaminos();
        private bool editMode = false;
        private string exprCoste = @"^[0-9]+([,][0-9]{2})?$";

        public FormInsertCamino()
        {
            InitializeComponent();
        }

        //Este segundo constructor servirá para el modo de edición, recogiendo el ENCamino.
        public FormInsertCamino(ENCaminos enCamino)
        {
            enCam = enCamino;
            editMode = true;
            InitializeComponent();
        }

        private void FormInsertCamino_Load(object sender, EventArgs e)
        {
            DataSet dsLugares = enLug.ObtenerNombresLugares();
            foreach (DataRow dr in dsLugares.Tables[0].Rows)
            {
                cbOrigen.Items.AddRange(dr.ItemArray);
                cbDestino.Items.AddRange(dr.ItemArray);
            }
            
            if (editMode)
            {
                this.Text = "Editar camino";
                btInsertar.Text = "&Actualizar";
                tbID.Text = enCam.ID.ToString();
                cbOrigen.Text = enCam.Origen.ToString();
                cbDestino.Text = enCam.Destino.ToString();
                tbCoste.Text = enCam.Coste.ToString();
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void btInsertar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarCampos())
                {
                    try
                    {
                        enCam.Origen = cbOrigen.Text;
                        enCam.Destino = cbDestino.Text;
                        enCam.Coste = int.Parse(tbCoste.Text);

                        if (enCam.InsertarCamino(editMode))
                        {
                            if (editMode)
                                MessageBox.Show("Camino editado correctamente", "Éxito al editar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            else
                                MessageBox.Show("Camino insertado correctamente", "Éxito al insertar", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.DialogResult = DialogResult.OK;
                        }
                        else
                            MessageBox.Show("Error, no se ha podido insertar el camino", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbCoste_TextChanged(object sender, EventArgs e)
        {
            if (!Regex.IsMatch(tbCoste.Text, exprCoste))
            {
                epInsertCamino.SetError(tbCoste, "Introduce un coste correcto (número real).");
            }
            else
            {
                epInsertCamino.SetError(tbCoste, "");
            }
            
        }

        private bool ValidarCampos()
        {
            bool correcto = true;

            try
            {
                string errores = "Corrige los siguientes errores:\n";

                if (cbOrigen.Text == "")
                {
                    correcto = false;
                    errores += "-Selecciona un origen\n";
                    epInsertCamino.SetError(cbOrigen, "Selecciona un origen");
                }
                else
                    epInsertCamino.SetError(cbOrigen, null);

                if (cbDestino.Text == "")
                {
                    correcto = false;
                    errores += "-Selecciona un destino\n";
                    epInsertCamino.SetError(cbDestino, "Selecciona un destino");
                }
                else
                    epInsertCamino.SetError(cbDestino, null);

                try
                {
                    if (!Regex.Match(tbCoste.Text, exprCoste).Success)
                    {
                        correcto = false;
                        errores += "-Introduce un coste correcto (número real)\n";
                        epInsertCamino.SetError(tbCoste, "Introduce un coste correcto (número real)");
                    }

                    else
                        epInsertCamino.SetError(tbCoste, null);
                }
                catch (FormatException fEx)
                {
                    MessageBox.Show(fEx.Message, "Error de formato", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (!correcto)
                {
                    throw new Exception(errores);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return correcto;
        }
    }
}
